package com.mzy.linear_struct.hot100.双指针;

import java.sql.Array;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Stream;

/**
 * @Author: mizy3
 * @Date: 2024/08/06/上午9:39
 * @Description:
 */
public class Pro15三数之和 {
    public List<List<Integer>> threeSum(int[] nums) {
        Arrays.sort(nums);

        //     l
        //  i
        // -4 -1 -1 0 1 2
        //              r
        List<List<Integer>> ans = new ArrayList<>();
        for (int i = 0; i < nums.length; i++) {
            if (i > 0 && nums[i] == nums[i - 1]) { // 去重
                continue;
            }
            int l = i + 1, r = nums.length - 1;
            while (l < r) {
                int sum = nums[i] + nums[l] + nums[r];
                if (sum < 0) {
                    l++;
                } else if (sum > 0) {
                    r--;
                } else {
                    ans.add(Arrays.asList(nums[i], nums[l], nums[r]));
                    while (l < r && nums[l] == nums[l + 1]) l++; // 去重

                    while (l < r && nums[r] == nums[r - 1]) r--; // 去重
                    l++;
                    r--;
                }
            }
        }

        return ans;
    }


    public static void main(String[] args) {
        System.out.println(new Pro15三数之和().threeSum(new int[]{-1, 0, 1, 2, -1, -4}));
    }


/*    public List<List<Integer>> threeSum(int[] nums) {

        // -1,0,1,2,-1,-4
        Arrays.sort(nums);
        List<List<Integer>> ans = new ArrayList<>();

        //     l
        // -4 -1 -1 0 1 2
        //  i
        //              r
        for (int i = 0; i < nums.length; i++) {
            int l = i + 1, r = nums.length - 1;
            if (i > 0 && nums[i] == nums[i - 1]) {
                continue;
            }

            while (l < r) {
                int sum = nums[i] + nums[l] + nums[r];
                if (sum == 0) {
                    ans.add(Arrays.asList(nums[i], nums[l], nums[r]));
                    while (l < r && nums[l] == nums[l + 1]) {
                        l++;
                    }
                    while (l < r && nums[r] == nums[r - 1]) {
                        r--;
                    }
                    l++;
                }else if(sum > 0){
                    r--;
                }else if(sum < 0){
                    l++;
                }
            }
        }


        return ans;
    }*/
}
